{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Perform Feature Selection using XGB Classifier\n",
    "Train XGBClassifier on features set 2- samples have 32 features. Then select features with top importance scores to form a new feature set. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Get the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stored variables and their in-db values:\n",
      "X_16_val                  -> array([[ 0.10924883,  1.83030605, -0.14807631, ...\n",
      "X_32_val                  -> array([[ 0.66944195,  0.46536115,  0.79919788, ...\n",
      "X_32test_std              -> defaultdict(<class 'list'>, {0: array([[ 0.6694419\n",
      "X_32train_std             -> array([[-0.74031227,  0.0126481 , -0.30967801, ...\n",
      "X_test                    -> defaultdict(<class 'list'>, {0: array([[[ -6.40490\n",
      "X_test_new                -> defaultdict(<class 'list'>, {0: array([[ 0.1092488\n",
      "X_test_std                -> defaultdict(<class 'list'>, {0: array([[ 0.1092488\n",
      "X_train                   -> array([[[ 0.00119031,  0.00873315,  0.00641749, ..\n",
      "X_train_new               -> array([[-0.74031227,  0.23616372, -0.18182195, ...\n",
      "X_train_std               -> array([[-0.74031227,  0.0126481 , -0.30967801, ...\n",
      "snrs                      -> [-20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, \n",
      "y_16_val                  -> array([6, 6, 5, ..., 0, 4, 1])\n",
      "y_32_test                 -> defaultdict(<class 'list'>, {0: array([2, 2, 4, ..\n",
      "y_32_train                -> array([0, 3, 4, ..., 0, 3, 1])\n",
      "y_32_val                  -> array([2, 2, 4, ..., 0, 7, 3])\n",
      "y_test                    -> defaultdict(<class 'list'>, {0: array([6, 6, 5, ..\n",
      "y_train                   -> array([0, 3, 4, ..., 0, 3, 1])\n"
     ]
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from collections import defaultdict\n",
    "import xgboost as xgb\n",
    "from xgboost.sklearn import XGBClassifier\n",
    "from sklearn.cross_validation import train_test_split\n",
    "from sklearn.datasets import dump_svmlight_file\n",
    "from sklearn.externals import joblib\n",
    "from sklearn.metrics import precision_score\n",
    "from sklearn import cross_validation, metrics\n",
    "from time import time\n",
    "import pandas as pd\n",
    "import collections\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.feature_selection import SelectFromModel\n",
    "from numpy import sort\n",
    "\n",
    "%store -r\n",
    "%store"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training data:  (80000, 32) and labels:  (80000,)\n",
      " \n",
      "Test data:\n",
      "Total 20 (4000, 32) arrays for SNR values:\n",
      "[-20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\n"
     ]
    }
   ],
   "source": [
    "print(\"Training data: \", X_32train_std.shape, \"and labels: \", y_32_train.shape)\n",
    "print(\" \")\n",
    "print(\"Test data:\")\n",
    "print(\"Total\", len(X_32test_std), X_32test_std[18].shape, \"arrays for SNR values:\")\n",
    "print(sorted(X_32test_std.keys()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Train and test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def train_and_test(model, train_data=X_32train_std, train_labels=y_32_train, test_data=X_32test_std, test_labels=y_32_test):\n",
    "    \n",
    "    dtrain = xgb.DMatrix(train_data, label=train_labels)\n",
    "    dtest = defaultdict(list)\n",
    "    for snr in snrs:\n",
    "        dtest[snr] = xgb.DMatrix(test_data[snr], label=test_labels[snr])\n",
    "    parameters = model.get_xgb_params()\n",
    "    \n",
    "    eval_history = xgb.cv(parameters, dtrain, metrics = 'mlogloss', nfold = 5, early_stopping_rounds = 20,\n",
    "                         num_boost_round = model.get_params()['n_estimators'])\n",
    "    model.set_params(n_estimators = eval_history.shape[0])\n",
    "    \n",
    "    eval_set = [(train_data, train_labels), (test_data[10], test_labels[10])]\n",
    "    start = time()\n",
    "    model.fit(train_data, train_labels, eval_metric = 'mlogloss', eval_set = eval_set) #fit model to data\n",
    "    print(\"Fitting model to data took {} minutes\".format((time() - start)/60))\n",
    "    \n",
    "    # Compute metric for training data\n",
    "    train_predict = model.predict(train_data)\n",
    "    train_predict_prob = model.predict_proba(train_data)\n",
    "    print(\"Log loss on training set =\", metrics.log_loss(train_labels, train_predict_prob))\n",
    "    \n",
    "    # Compute metric for test data\n",
    "    test_logloss = []\n",
    "    for snr in snrs:\n",
    "        test_predict = model.predict(test_data[snr])\n",
    "        test_predict_prob = model.predict_proba(test_data[snr])\n",
    "        loss = metrics.log_loss(test_labels[snr], test_predict_prob)\n",
    "        test_logloss.append(loss)\n",
    "    print(\"Log loss on test set =\", np.mean(test_logloss))\n",
    "    \n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0]\tvalidation_0-mlogloss:1.95137\tvalidation_1-mlogloss:1.81709\n",
      "[1]\tvalidation_0-mlogloss:1.85664\tvalidation_1-mlogloss:1.62606\n",
      "Fitting model to data took 0.0342695156733195 minutes\n",
      "Log loss on training set = 1.85664015828\n",
      "Log loss on test set = 1.85786188921\n"
     ]
    }
   ],
   "source": [
    "xgb1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=2,\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.8,\n",
    "        colsample_bytree=0.8,\n",
    "        objective= 'multi:softmax',\n",
    "        num_class = 8,\n",
    "        nthread=4,\n",
    "        scale_pos_weight=1,\n",
    "        seed=27)\n",
    "model = train_and_test(xgb1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Accuracy vs. SNR on test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy at  -20 dB = 0.12725\n",
      "Test accuracy at  -18 dB = 0.12275\n",
      "Test accuracy at  -16 dB = 0.131\n",
      "Test accuracy at  -14 dB = 0.12425\n",
      "Test accuracy at  -12 dB = 0.13725\n",
      "Test accuracy at  -10 dB = 0.17675\n",
      "Test accuracy at  -8 dB = 0.2375\n",
      "Test accuracy at  -6 dB = 0.307\n",
      "Test accuracy at  -4 dB = 0.3955\n",
      "Test accuracy at  -2 dB = 0.38125\n",
      "Test accuracy at  0 dB = 0.43425\n",
      "Test accuracy at  2 dB = 0.521\n",
      "Test accuracy at  4 dB = 0.7525\n",
      "Test accuracy at  6 dB = 0.811\n",
      "Test accuracy at  8 dB = 0.8075\n",
      "Test accuracy at  10 dB = 0.82575\n",
      "Test accuracy at  12 dB = 0.83225\n",
      "Test accuracy at  14 dB = 0.84325\n",
      "Test accuracy at  16 dB = 0.82975\n",
      "Test accuracy at  18 dB = 0.83625\n"
     ]
    }
   ],
   "source": [
    "predictions = defaultdict(list)\n",
    "accuracy = defaultdict(list)\n",
    "y_pred = defaultdict(list)\n",
    "# for snr in snrs:\n",
    "#     predictions[snr] = model.predict(X_test_std[snr])\n",
    "#     y_pred[snr] = np.asarray([np.argmax(line) for line in predictions[snr]])\n",
    "#     accuracy[snr] = metrics.accuracy_score(y_test[snr], y_pred[snr])\n",
    "#     print (\"Test accuracy at \",snr,\"dB =\", accuracy[snr])\n",
    "   \n",
    "for snr in snrs:\n",
    "    y_pred[snr] = model.predict(X_32test_std[snr])\n",
    "    predictions[snr] = [round(value) for value in y_pred[snr]]\n",
    "    accuracy[snr] = accuracy_score(y_32_test[snr], predictions[snr])\n",
    "    print (\"Test accuracy at \",snr,\"dB =\", accuracy[snr])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Importance score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Feature importance scores- highest first\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Features</th>\n",
       "      <th>Importance Scores</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>f5</td>\n",
       "      <td>0.149220</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>f14</td>\n",
       "      <td>0.124722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>f13</td>\n",
       "      <td>0.104677</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>f6</td>\n",
       "      <td>0.102450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>f1</td>\n",
       "      <td>0.091314</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>f21</td>\n",
       "      <td>0.075724</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>f17</td>\n",
       "      <td>0.040089</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>f29</td>\n",
       "      <td>0.037862</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>f18</td>\n",
       "      <td>0.037862</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>f30</td>\n",
       "      <td>0.028953</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>f9</td>\n",
       "      <td>0.026726</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>f10</td>\n",
       "      <td>0.022272</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>f25</td>\n",
       "      <td>0.020045</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>f26</td>\n",
       "      <td>0.015590</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>f19</td>\n",
       "      <td>0.015590</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>f11</td>\n",
       "      <td>0.015590</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>f12</td>\n",
       "      <td>0.013363</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>f28</td>\n",
       "      <td>0.013363</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>f22</td>\n",
       "      <td>0.011136</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>f20</td>\n",
       "      <td>0.011136</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>f2</td>\n",
       "      <td>0.008909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>f27</td>\n",
       "      <td>0.008909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>f16</td>\n",
       "      <td>0.006682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>f3</td>\n",
       "      <td>0.006682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>f15</td>\n",
       "      <td>0.002227</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>f4</td>\n",
       "      <td>0.002227</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>f7</td>\n",
       "      <td>0.002227</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>f31</td>\n",
       "      <td>0.002227</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>f24</td>\n",
       "      <td>0.002227</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>f8</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>f23</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>f32</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Features  Importance Scores\n",
       "0        f5           0.149220\n",
       "1       f14           0.124722\n",
       "2       f13           0.104677\n",
       "3        f6           0.102450\n",
       "4        f1           0.091314\n",
       "5       f21           0.075724\n",
       "6       f17           0.040089\n",
       "7       f29           0.037862\n",
       "8       f18           0.037862\n",
       "9       f30           0.028953\n",
       "10       f9           0.026726\n",
       "11      f10           0.022272\n",
       "12      f25           0.020045\n",
       "13      f26           0.015590\n",
       "14      f19           0.015590\n",
       "15      f11           0.015590\n",
       "16      f12           0.013363\n",
       "17      f28           0.013363\n",
       "18      f22           0.011136\n",
       "19      f20           0.011136\n",
       "20       f2           0.008909\n",
       "21      f27           0.008909\n",
       "22      f16           0.006682\n",
       "23       f3           0.006682\n",
       "24      f15           0.002227\n",
       "25       f4           0.002227\n",
       "26       f7           0.002227\n",
       "27      f31           0.002227\n",
       "28      f24           0.002227\n",
       "29       f8           0.000000\n",
       "30      f23           0.000000\n",
       "31      f32           0.000000"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_names = ['f'+str(i) for i in range(1,33)]\n",
    "print(\"Feature importance scores- highest first\")\n",
    "df1 = pd.DataFrame(data = {'Features':feature_names, 'Importance Scores': model.feature_importances_})\n",
    "sorted_df = df1.sort_values(by = ['Importance Scores'], ascending = False)\n",
    "sorted_df.reset_index(inplace = True)\n",
    "del sorted_df['index']\n",
    "sorted_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nf+G+qurEqvrzqnrH9Nz95CZq3WV6zg78HH5ps8/ZtN5RVfXXVfVHm6lVVfun1/u1VbVnk7WOr6rL\nqupd07rfvOBz9pAVr4Nrq+oTVfVTm+jrX0/P/fVV9XtVdZdN1PrJqc7e9XpaVWvd99QFxv7Bas01\n9uept+D4X6/W3ON/nsc5rbeRsX+w52yjY/9gtTY69td7vuYe+xvobaPj/2C1Njr+180BVXV+Vb1n\nup2/yVp/UlUfO9iYmKdWVT2sZq/9vdP933OwekeU7nbb4luSdyU5KcmXJnlkkv83yc9ssta3JLn3\ntOwJSd6yiVp3z/85Pv8bkrxr0VrT9FFJXpfkyiRnb6Kvxyb5oy18/o/P7ITaB0zLv3Qzj3PFsu/K\n7Ao5i/b1b5I8Z1q2M7MTgY9ZsNavJHnmtOyhSV67FWN0+pm+N8kDkxyT5G1JTll0vCd5TJKHJ7l+\nk319RZKHT9P3SPLuRftKUknuPk0fneQtSb5p0d5WrPfTSX73YGN5zudsf5L7bfZnOa1zSZIfnKaP\nSXL8Zh7jijHyvzL70IZFnv/7J3lfkuOm+VcmeeqCtb4uyfVJ7prZSf5/luRBh6i15nvqgmN/3ffn\nzDn25+xtkfG/Xq25x/88j3OBsX+w52x/Njb2D1Zro2P/kL9rc4ixP+fzv8j4X6/WIuN/zRyQ5D5J\nbpy+3nuavvcitab50zP7nXnQ3+1z9PXgJCdP01+Z5G/X+1keaTd7tLdYVf3nzN6gL0/ylO6+Osnn\ntqDWo7r7o9Ndf5nZtcUXrfVDPY3WJHdLsqEzYlfWqqp/neTHk/y3JB/aSJ01+vonG93+EPWekeRV\n3f3+JOnuDfW3xuM84Lwkv7eJvjrJPaqqMntTuTWzq+ssUuvHMvsjJ939riS7qurLNrD9emP0tCT7\nuvvG7r49yaVJzlqwVrr7DdPj3FRf3f233X3NNP3JJO/M7BfWIrW6uz81zR493dZ8Lcz7OKvqhCRn\nJnnRZh7nvOapVVX3yizsvThJuvv27v7YFvR1epL3dvffbKLWjiTH1exzFO6a5IML1vqazELHZ7r7\njiSvT/Ldh6i13nvqImN/3ffnecb+vPUWHP/r1Zpr/M/7OBcY+1v5O23NWguO/Xn6Wnfsb7DeRsf/\nerUWGf/r5YDHJ3lNd986fa/XJDljwVrp7tcm+eQ/epI2WKu7393d75mmP5hZ3jjkpzIeEQ530t+O\nt6z6azyzj5RfdI/2P6g1LfuZJC/aTK0kT87sL8hbk3zzorUye5N/fWaHIb00i+3RPlDrsZl9YNHb\nkvxxkq/2S5snAAAIm0lEQVTdzHOW5NeTPD/J/0jy1iQ/sAU/y7tOz9l9NtHXPZL8eWZ/kX8qyZmb\nqPXvkzx3WnZaZoH9EZsdo5ld1/5FK+a/P8nzNjPek+zKofdoz/3ameq9P8k9F62V2Z6pa6efw3M2\n21uSy5I8Iof478yctd6X5Jpp7F6wiZ/lwzL7HIKXJvnrzILQ3bbg+X9Jkgs3+Rh/cnrub0nyO5t4\njF+T2d7d+2b2Gn1zkt+Yp9a07O/fU7OJsb+61kbG/kbqLTL+16qVOcf/nLUWGvvr1Fpo7K/xs1x4\n7B/iuT/o2N/A41xo/K/xOBca/1kjB0x1f2HF+r+Y9d8DDlprxXoHHRMbqTXdf1pmf2R+yaFeU0fC\nzR7tJVNV35bk6Ul+bjN1uvvV3f3QJE9K8subKPXrSX6uu7+wmX4m12T2r7hvTPIbSf5gk/V2ZPbG\nf2Zmf6X/YlU9eJM1vyvJm7r7kHuoDuLxmf1y+8rMfhE8r6ruuWCti5McX1XXZvafhb9OsszXnJ9L\nVd09s/+i/FR3f2LROt39+e5+WGZ7hk6rOY9xX6enf5HkQ9391kVrrPLo7n54Zv8ifkZVPWbBOjsy\nO3Tht7r7nyT5dJJ1jzueR80+hOyJSX5/EzXundme4pMyey3craq+b5Fa3f3OJM9J8qdJ/iSz19dc\nr4Otek/d6loHq7fI+F+r1qLjf3WtzYz9dR7jQmN/jVoLj/2DPPcLjf01nrOFx//qWouO/y3MAXda\nrar6iiQvS/K0LcodwwnaS6SqviGzv8jP6u6PbEXNnv1b84FVdb8FS5ya5NKq2p/ZnqDfrKonLdjL\nJ3r6V2Z3X5nk6E30lSQ3Jbmquz/d3R9O8oYkGz6JdJVzs8HDRtbwtMwOaenu3pfZ3puHLlJoes6e\nNv2y/IHM/pV24yb7S5Kbk5y4Yv6EadlhV1VHZxYyfqe7X7UVNXv27+Q/zxr/It2Af5rkidNr4dIk\n315VL99ETzdPXz+U5NWZ7cVZxE1Jburut0zzl2UWPjbjCUmu6e7/vYka35Hkfd19S3d/LsmrMjsG\ndSHd/eLufkR3PybJRzPbw3dQ67ynLjT2t/r9eb16i4z/Q/W2kfG/Tq2Fxv56fS0y9teptdDYP8Tz\nteGxv069hcb/QZ6zDY//FduuzAGbeu/fgkyxbq1ph9QVSf5td//lZuvfWQTtJVFVD8jshfj93T33\nC2idWg+ajg9OVT08ybGZHbKxYd19Unfv6u5dmb2J/Vh3L7Qnuqq+fEVfp2U2PjfzC+u/J3l0Ve2o\nqrsmeVRm/25ayHS837dOdTfj/Zkd45fpeOqHZMFwXLMz6o+ZZn8wyRs2s4d3hauTnFxVJ031z83s\n+LnDahofL07yzu7+tU3W2llVx0/TxyX5zsz+XbmQ7v757j5hei2cm9kJswvtoa2qu1XVPQ5MJ3lc\nZic7LdLX/0rygap6yLTo9MxOEt6MDZ+nsIb3J/mmqrrr9HM9PZt7fX7p9PUBmR2f+ruHWH+999QN\nj/2tfH8+WL1Fxv9Bam14/K9Xa5Gxf5C+Njz2D9LXhsf+HD/LDY39g9Tb8Pg/WG8LjP/1csBVSR5X\nVfee9ro/blq2SK0NW6/W9Fp8dZLf7u7LFql92GzlcShu//BYoyRfntlf1J9I8rFpes3j6eao9aLM\n/kq9drrt2URfP5dk71TnzZn9m26hWquWvTSbO0b7wqmvt2V2ose3bOb5n6Z/NrM31usz+zfrZmo9\nNcmlWzAuvjKzf/G9ferr+zZR65sz23NxQ2ZvwGueHb7IGE3yz6fa781sD8Jmav1eZsekf25a/vRF\naiV5dGYnx1y34rXwzxes9Q2ZHWpz3fRzuGizz9mKdR+bOY5TPUhvD5xeB2+bXhObff4flmTP9Fj/\nYL1xMmetu2X2S/ReWzDGfimzcHd9Zv8OPnYTtd6Y2Wv9bUlOn6Ovdd9Ts/Gxf7Bac439eeplsfG/\nXq25x/88j3OBsb9eX4uM/YM9/xsd+werNdfY30C9jY7/g9Xa6PhfNwck+VdJ9k23p22y1hszOwb9\n7zIb/49fpFaS78vsNXTtitvDDvVzOBJuPoIdAAAGcOgIAAAMIGgDAMAAgjYAAAwgaAMAwACCNgAA\nDCBoAyyJqvp8VV274rZrgRrHV9WPbX13AKzm8n4AS6KqPtXdd99kjV2ZXed4Qx83X1VHdfdcH2sO\nwIw92gBLrKqOqqpfqaqrq+q6qvrhafndq+q1VXVNVb29qs6aNrk4yVdPe8R/paoeW1V/tKLe86rq\nqdP0/qq6qKr+Z5Jzquqrq+pPquqtVfXGqnrotN45VXV9Vb2tqt5w5z4DAEeuHYe7AQDmdlxVXTtN\nv6+7n5zk6Uk+3t2PrKpjk7ypqv40yQeSPLm7P1FV90vyl1V1eZLdSb6uux+WJFX12EN8z9u6+9HT\nuq9N8iPd/Z6qelSS30zy7UkuyuwT324+8LHeAAjaAMvk7w4E5BUel+Qbqursaf5eSU7O7OOO/31V\nPSbJF5LcP8mXLfA9X5HM9pAn+ZYkv19VB+47dvr6piQvrapXJnnVAt8DYFsStAGWWyX58e6+6h8s\nnB3+sTPJI7r7c1W1P8ld1tj+jvzDwwhXr/Pp6euXJPnYGkE/3f0j0x7uM5NcW1UP6+6PLPJgALYT\nx2gDLLerkvxoVR2dJFX14Kq6W2Z7tj80hexvS/JV0/qfTHKPFdv/TZJTqurY6bCP09f6Jt39iSTv\nq6pzpu9TVfWN0/RXd/dbuvuiJB9OcuLWP0yA5WOPNsBye1GSXUmuqdkxHbckeVKS30nyh1W1J8m1\nSd6VJN39kap6U1Vdn+SPu/tnp0M+rkvy7iR/fZDv9ZQkv1VVv5Dk6CSXJnlbkl+pqpMz27v+2mkZ\nwBc9l/cDAIABHDoCAAADCNoAADCAoA0AAAMI2gAAMICgDQAAAwjaAAAwgKANAAAD/P8nmq9HKpQ7\nkwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x179a33a5320>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Scores using XGBoost's function:\n"
     ]
    },
    {
     "data": {
      "image/png": "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\na0tj3lqrz5ckSZIklVtN7nIsSZIkSVKt2dBKkiRJkuqSDa0kSZIkqS7Z0EqSJEmS6pINrSRJkiSp\nLtnQSp00Y8YMhg8fzvjx4zft+/jHP864ceM46KCDOPHEE3nuOZ88JUmSJPWUQhraiJgdESsj4rsR\n8V8RsSIifhURpxaRR+qM6dOns2zZspftO+qoo3jwwQe5//772X///TnvvPMKSidJkiT1PUWt0M4C\njgN+DjyUmQcDjcCFEdG/oEzSNh1xxBHsscceL9t39NFHs/PO7Y9zPuyww3jyySeLiCZJkiT1STv3\n9AdGxEJgNHAT8C3g1RERwCDgT0Db9uZYt2EjDXOW1jSninX2hDam17DGLfOO7/Y5r7jiCk455ZRu\nn1eSJEnSlkVm9vyHRrQAk4G/0d7YjgNeDZySmVvsYiJiJjATYOjQYZPmzr+0Z8KqECMGwDPrajf/\nhJFDunTe008/zbnnnsvixYtftv+qq66iubmZz3/+87T/+4y2p7W1lUGDBhUdQzVkjcvPGpefNS4/\na9w31Fudp0yZsjwzJ3dmbI+v0G7m7UAT8D+A1wO3RsRdmblm84GZuQhYBLDP6P3ywgeKjq5aOntC\nG7Wsccu0xq6d19LCwIEDaWz87/OvvPJKfvWrX3Hbbbex2267dU/APqBSqbzs96jyscblZ43LzxqX\nnzXuG8pc56K7wlOBedm+TPxYRDxO+2rtz7Z10oBd+tFcg0tG1XtUKpUuN509admyZZx//vnccccd\nNrOSJElSDyv6sT2/A44EiIgRwFjgN4UmkrZi6tSpHH744TQ3NzNq1Cguv/xyPvrRj/LCCy9w1FFH\nMXHiRM4444yiY0qSJEl9RtErtP8OXBkRDwABfDIzVxWcSdqiJUuW/N2+0047rYAkkiRJkqCghjYz\nGzpsHl1EBkmSJElSfSv6kmNJkiRJkrrEhlaSJEmSVJdsaCVJkiRJdcmGVpIkSZJUl2xoVRozZsxg\n+PDhjB8/ftO+P/3pTxx11FGMGTOGo446ij//+c8FJpQkSZLUnQppaCNidkSsjIilEfHdiLg/In4W\nEeO3f7a0ZdOnT2fZsmUv2zdv3jyOPPJIHn30UY488kjmzZtXUDpJkiRJ3a2oFdpZwHHAQ0BTZh4E\n/CuwoKA8KoEjjjiCPfbY42X7brzxRj7wgQ8A8IEPfIAbbrihiGiSJEmSaqDHn0MbEQuB0cBN1T+P\nAcjMhyOiISJGZOYz25pj3YaNNMxZWvuwKsyVxwzslnmeeeYZ9t57bwD22msvnnlmm/9pSZIkSaoj\nPb5Cm5lnAE8BU2hfkT0JICLeBOwLjOrpTOobIoKIKDqGJEmSpG7S4yu0m5kHLIiIJuAB4JfAxi0N\njIiZwEyAoUOHMXdCW4+FVM9rbW2lUqns8HlPP/00a9eu3XTu4MGDue6669hzzz1ZvXo1r371q7s0\nr7pfV2us+mGNy88al581Lj9r3DeUuc6FNrSZuQY4FSDal84eB36zlbGLgEUAY8eOzY9Ne2dPxVQB\nKpUKjY2NO3xeS0sLAwcO3HTuKaecwqOPPsq73/1u5s2bx/ve974uzavu19Uaq35Y4/KzxuVnjcvP\nGvcNZa5zoY/tiYjdI6J/dfN04M5qkyvtsKlTp3L44YfT3NzMqFGjuPzyy5kzZw633norY8aM4Yc/\n/CFz5swpOqYkSZKkblL0JccHAN+IiAR+BZxWcB7VsSVLlmxx/2233dbDSSRJkiT1hEIa2sxsqL5d\nBexfRAZJkiRJUn0r9JJjSZIkSZK6yoZWkiRJklSXbGglSZIkSXXJhlaSJEmSVJdsaCVJkiRJdcmG\nVr3WggULGD9+PG94wxuYP39+0XEkSZIk9TI1bWgjYnZErIyIjIj7I+KBiLg7Ig7ebFy/iPhlRNxc\nyzyqH48//jiXXnopP/vZz1ixYgU333wzjz32WNGxJEmSJPUitV6hnQUcB7wZeFtmTgD+HVi02bgz\ngZU1zqI68tvf/pZDDz2U3XbbjZ133pm3ve1tXH/99UXHkiRJktSL7FyriSNiITAauAm4IjPvrh66\nFxjVYdwo4HjgC8D/7szc6zZspGHO0u4NrJpqmXf8Do1/3etex7e+9S1Wr17NgAEDuOWWW5g8eXKN\n0kmSJEmqR5GZtZs8ogWYnJmrOuw7BxiXmadXt68FzgNeDZyTmSdsZa6ZwEyAoUOHTZo7/9Ka5Vb3\nmzByyA6Nb21t5Y477uDGG29kwIABNDQ0sMsuu/DRj360RgnV01pbWxk0aFDRMVRD1rj8rHH5WePy\ns8Z9Q73VecqUKcszs1OrWTVbod2SiJgCnAa8pbp9AvBsZi6PiMZtnZuZi6heqrzP6P3ywgd6NLpe\noZZpjTs0vlKp8KUvfYkvfelLAHzqU59i1KhRNDbu2DzqvSqVivUsOWtcfta4/Kxx+VnjvqHMde6x\n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\n1dOiFgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x179a33bb828>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "plt.figure(figsize = (12,8))\n",
    "plt.bar(range(len(model.feature_importances_)), model.feature_importances_)\n",
    "plt.xlabel(\"Features\")\n",
    "plt.xticks(np.arange(X_32train_std.shape[1]+1), feature_names)\n",
    "plt.ylabel(\"Importance score\")\n",
    "plt.show()\n",
    "print(\"Scores using XGBoost's function:\")\n",
    "\n",
    "xgb.plot_importance(model, ylabel = 'Features')\n",
    "fig = plt.gcf()\n",
    "fig.set_size_inches(16,8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feature Selection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.        ,  0.        ,  0.        ,  0.00222717,  0.00222717,\n",
       "        0.00222717,  0.00222717,  0.00222717,  0.00668151,  0.00668151,\n",
       "        0.00890869,  0.00890869,  0.01113586,  0.01113586,  0.01336303,\n",
       "        0.01336303,  0.0155902 ,  0.0155902 ,  0.0155902 ,  0.02004454,\n",
       "        0.02227172,  0.02672606,  0.02895323,  0.03786192,  0.03786192,\n",
       "        0.04008909,  0.07572383,  0.09131403,  0.10244989,  0.10467706,\n",
       "        0.1247216 ,  0.1492205 ], dtype=float32)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Fit model using each importance as a threshold\n",
    "thresholds = sort(model.feature_importances_)\n",
    "thresholds"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## On training set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Top 32 features selected\n",
      "Thresh=0.000, n_features=32, Accuracy: 52.23%\n",
      "  \n",
      "Top 32 features selected\n",
      "Thresh=0.000, n_features=32, Accuracy: 52.23%\n",
      "  \n",
      "Top 32 features selected\n",
      "Thresh=0.000, n_features=32, Accuracy: 52.23%\n",
      "  \n",
      "Top 29 features selected\n",
      "Thresh=0.002, n_features=29, Accuracy: 52.23%\n",
      "  \n",
      "Top 29 features selected\n",
      "Thresh=0.002, n_features=29, Accuracy: 52.23%\n",
      "  \n",
      "Top 29 features selected\n",
      "Thresh=0.002, n_features=29, Accuracy: 52.23%\n",
      "  \n",
      "Top 29 features selected\n",
      "Thresh=0.002, n_features=29, Accuracy: 52.23%\n",
      "  \n",
      "Top 29 features selected\n",
      "Thresh=0.002, n_features=29, Accuracy: 52.23%\n",
      "  \n",
      "Top 24 features selected\n",
      "Thresh=0.007, n_features=24, Accuracy: 52.32%\n",
      "  \n",
      "Top 24 features selected\n",
      "Thresh=0.007, n_features=24, Accuracy: 52.32%\n",
      "  \n",
      "Top 22 features selected\n",
      "Thresh=0.009, n_features=22, Accuracy: 52.27%\n",
      "  \n",
      "Top 22 features selected\n",
      "Thresh=0.009, n_features=22, Accuracy: 52.27%\n",
      "  \n",
      "Top 20 features selected\n",
      "Thresh=0.011, n_features=20, Accuracy: 52.28%\n",
      "  \n",
      "Top 20 features selected\n",
      "Thresh=0.011, n_features=20, Accuracy: 52.28%\n",
      "  \n",
      "Top 18 features selected\n",
      "Thresh=0.013, n_features=18, Accuracy: 52.25%\n",
      "  \n",
      "Top 18 features selected\n",
      "Thresh=0.013, n_features=18, Accuracy: 52.25%\n",
      "  \n",
      "Top 16 features selected\n",
      "Thresh=0.016, n_features=16, Accuracy: 52.03%\n",
      "  \n",
      "Top 16 features selected\n",
      "Thresh=0.016, n_features=16, Accuracy: 52.03%\n",
      "  \n",
      "Top 16 features selected\n",
      "Thresh=0.016, n_features=16, Accuracy: 52.03%\n",
      "  \n",
      "Top 13 features selected\n",
      "Thresh=0.020, n_features=13, Accuracy: 51.95%\n",
      "  \n",
      "Top 12 features selected\n",
      "Thresh=0.022, n_features=12, Accuracy: 51.94%\n",
      "  \n",
      "Top 11 features selected\n",
      "Thresh=0.027, n_features=11, Accuracy: 52.02%\n",
      "  \n",
      "Top 10 features selected\n",
      "Thresh=0.029, n_features=10, Accuracy: 51.97%\n",
      "  \n",
      "Top 9 features selected\n",
      "Thresh=0.038, n_features=9, Accuracy: 51.76%\n",
      "  \n",
      "Top 9 features selected\n",
      "Thresh=0.038, n_features=9, Accuracy: 51.76%\n",
      "  \n",
      "Top 7 features selected\n",
      "Thresh=0.040, n_features=7, Accuracy: 51.47%\n",
      "  \n",
      "Top 6 features selected\n",
      "Thresh=0.076, n_features=6, Accuracy: 51.15%\n",
      "  \n",
      "Top 5 features selected\n",
      "Thresh=0.091, n_features=5, Accuracy: 49.96%\n",
      "  \n",
      "Top 4 features selected\n",
      "Thresh=0.102, n_features=4, Accuracy: 48.16%\n",
      "  \n",
      "Top 3 features selected\n",
      "Thresh=0.105, n_features=3, Accuracy: 47.14%\n",
      "  \n",
      "Top 2 features selected\n",
      "Thresh=0.125, n_features=2, Accuracy: 42.41%\n",
      "  \n",
      "Top 1 features selected\n",
      "Thresh=0.149, n_features=1, Accuracy: 30.10%\n",
      "  \n"
     ]
    }
   ],
   "source": [
    "train_accs = []\n",
    "num_features = []\n",
    "thresh_vals = []\n",
    "\n",
    "for thresh in thresholds:\n",
    "    \n",
    "    # select features using threshold\n",
    "    selection = SelectFromModel(model, threshold=thresh, prefit=True)\n",
    "    #selecting features based on importance weights\n",
    "    #features whose importance is >= thresh are kept, and the remaining discarded\n",
    "    \n",
    "    select_X_train = selection.transform(X_32train_std)\n",
    "    n_features = select_X_train.shape[1]\n",
    "    print(\"Top {} features selected\".format(n_features))\n",
    "    selection_model = XGBClassifier()\n",
    "    selection_model.fit(select_X_train, y_train)\n",
    "    \n",
    "    #Evaluate model on training set\n",
    "    y_pred = selection_model.predict(select_X_train)\n",
    "    predictions = [round(value) for value in y_pred]\n",
    "    accuracy = accuracy_score(y_32_train, predictions)\n",
    "    print(\"Thresh=%.3f, n_features=%d, Accuracy: %.2f%%\" % (thresh, n_features, accuracy*100.0))\n",
    "    print(\"  \")\n",
    "    train_accs.append(accuracy)\n",
    "    num_features.append(n_features)\n",
    "    thresh_vals.append(thresh)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    Threshold  Training accuracy  n_features\n",
      "8    0.006682           0.523238          24\n",
      "9    0.006682           0.523238          24\n",
      "13   0.011136           0.522763          20\n",
      "12   0.011136           0.522763          20\n",
      "11   0.008909           0.522663          22\n",
      "10   0.008909           0.522663          22\n",
      "15   0.013363           0.522500          18\n",
      "14   0.013363           0.522500          18\n",
      "0    0.000000           0.522312          32\n",
      "7    0.002227           0.522312          29\n",
      "6    0.002227           0.522312          29\n",
      "5    0.002227           0.522312          29\n",
      "4    0.002227           0.522312          29\n",
      "3    0.002227           0.522312          29\n",
      "2    0.000000           0.522312          32\n",
      "1    0.000000           0.522312          32\n",
      "18   0.015590           0.520338          16\n",
      "16   0.015590           0.520338          16\n",
      "17   0.015590           0.520338          16\n",
      "21   0.026726           0.520188          11\n",
      "22   0.028953           0.519737          10\n",
      "19   0.020045           0.519463          13\n",
      "20   0.022272           0.519375          12\n",
      "23   0.037862           0.517637           9\n",
      "24   0.037862           0.517637           9\n",
      "25   0.040089           0.514713           7\n",
      "26   0.075724           0.511513           6\n",
      "27   0.091314           0.499575           5\n",
      "28   0.102450           0.481637           4\n",
      "29   0.104677           0.471413           3\n",
      "30   0.124722           0.424088           2\n",
      "31   0.149220           0.300988           1\n",
      "Best training accuracy is obtained upon selection of top 24 features (according to importance score)\n",
      "The corresponding threshold value is 0.00668151443824172\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(data= {'Threshold':thresh_vals,'n_features':num_features, 'Training accuracy':train_accs})\n",
    "sorted_df = df.sort_values(by = ['Training accuracy'], ascending = False)\n",
    "sorted_df.reset_index()\n",
    "print(sorted_df)\n",
    "sorted_df.reset_index(inplace = True) #reset because sorting messed up the indices\n",
    "idx = sorted_df['Training accuracy'].idxmax()\n",
    "sel_row= sorted_df.iloc[idx]\n",
    "best_features = int(sel_row['n_features'])\n",
    "best_thresh = sel_row['Threshold']\n",
    "print('Best training accuracy is obtained upon selection of top {} features (according to importance score)'.format(best_features))\n",
    "print(\"The corresponding threshold value is {}\".format(best_thresh))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Modify training and test data to include only selected features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Top 24 features selected\n",
      "New training set (80000, 24) and labels (80000,)\n",
      "New test set (4000, 24) and labels (4000,) for each SNR value\n"
     ]
    }
   ],
   "source": [
    "X_32test_new = defaultdict(list)\n",
    "\n",
    "selection = SelectFromModel(model, threshold = best_thresh, prefit=True)\n",
    "\n",
    "X_32train_new  = selection.transform(X_32train_std)\n",
    "n_features = select_X_train.shape[1]\n",
    "print(\"Top {} features selected\".format(best_features))\n",
    "print(\"New training set {} and labels {}\".format(X_32train_new.shape, y_32_train.shape))\n",
    "\n",
    "for snr in snrs:\n",
    "    X_32test_new[snr] = selection.transform(X_32test_std[snr])\n",
    "print(\"New test set {} and labels {} for each SNR value\".format(X_32test_new[10].shape, y_32_test[10].shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Store the new training and test sets in Jupyter's db"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stored 'X_32train_new' (ndarray)\n",
      "Stored 'X_32test_new' (defaultdict)\n",
      "Stored variables and their in-db values:\n",
      "X_16_val                  -> array([[ 0.10924883,  1.83030605, -0.14807631, ...\n",
      "X_32_val                  -> array([[ 0.66944195,  0.46536115,  0.79919788, ...\n",
      "X_32test_new              -> defaultdict(<class 'list'>, {0: array([[ 0.6694419\n",
      "X_32test_std              -> defaultdict(<class 'list'>, {0: array([[ 0.6694419\n",
      "X_32train_new             -> array([[-0.74031227,  0.0126481 , -0.30967801, ...\n",
      "X_32train_std             -> array([[-0.74031227,  0.0126481 , -0.30967801, ...\n",
      "X_test                    -> defaultdict(<class 'list'>, {0: array([[[ -6.40490\n",
      "X_test_new                -> defaultdict(<class 'list'>, {0: array([[ 0.1092488\n",
      "X_test_std                -> defaultdict(<class 'list'>, {0: array([[ 0.1092488\n",
      "X_train                   -> array([[[ 0.00119031,  0.00873315,  0.00641749, ..\n",
      "X_train_new               -> array([[-0.74031227,  0.23616372, -0.18182195, ...\n",
      "X_train_std               -> array([[-0.74031227,  0.0126481 , -0.30967801, ...\n",
      "snrs                      -> [-20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, \n",
      "y_16_val                  -> array([6, 6, 5, ..., 0, 4, 1])\n",
      "y_32_test                 -> defaultdict(<class 'list'>, {0: array([2, 2, 4, ..\n",
      "y_32_train                -> array([0, 3, 4, ..., 0, 3, 1])\n",
      "y_32_val                  -> array([2, 2, 4, ..., 0, 7, 3])\n",
      "y_test                    -> defaultdict(<class 'list'>, {0: array([6, 6, 5, ..\n",
      "y_train                   -> array([0, 3, 4, ..., 0, 3, 1])\n"
     ]
    }
   ],
   "source": [
    "%store X_32train_new\n",
    "%store X_32test_new\n",
    "%store"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
